package iteratorbind.impl;


import iteratorbind.base.BaseMenuComponent;
import java.util.Iterator;

/**
 * 女招待对象 适应树结构
 * @author yaojianfeng
 */
public class WaitressTree {
    /**
     * 我们把顶层的菜单组件交给女招待
     * 最顶层菜单包含其他所有菜单
     * 我们称之为 allMenus
     */
   private BaseMenuComponent allMenus;

    public WaitressTree(BaseMenuComponent allMenus) {
        this.allMenus = allMenus;
    }

    /**
     *女招待只需要调用最顶层菜单的print()
     * 可以打印整个菜单层次 包括所有的菜单以及所有菜单项
     */
    public void printMenu(){
        allMenus.print();
    }

    /**
     * 打印素食菜单
     */
    public void printVegetarianMenu(){
        Iterator iterator = allMenus.getIterator();
        System.out.println("\n 素食菜单: \n--------");
        while (iterator.hasNext()){
            BaseMenuComponent next = (BaseMenuComponent) iterator.next();

            try {
                //调用每个元素的 isVegetarian()方法
                if (next.isVegetarian()){
                    //如果为true,调用它的print()方法
                   // 只有菜单项的print()方法可以被调用 这里是不会调用菜单的print() 因为在调用之前就出现异常了
                    next.print();
                }
            }
            //我们在菜单上实现isVegetarian()方法 让它永远抛出异常 如果异常真的发生了,我们就捕捉这个异常 然后继续遍历
            catch (UnsupportedOperationException e) {
                //只能调用菜单项的print()方法可以被调用
                System.err.println("这是个菜单: " + next.getName());
            }

        }

    }

    @Override
    public String toString( ){
      return   allMenus.toString();
    }
}
